#include "EstrategiaMovimientoRegresarACueva.h"

#include "ComparadorPunto.h"
#include "EscenarioModelo.h"

EstrategiaMovimientoRegresarACueva::EstrategiaMovimientoRegresarACueva(Punto* punto,ObjetoVivo *unaPresa,unsigned short velocidad)
	: EstrategiaMovimientoFantasma(unaPresa, new Direccion(Direccion::DERECHA), velocidad){ 
	
        this->puntoCueva = punto;
}

Punto* EstrategiaMovimientoRegresarACueva::calcularMasCercano(Lista<Punto>* lista, Punto* puntoActual){
		return EstrategiaMovimientoFantasma::calcularMasCercano(lista, puntoActual,this->puntoCueva);
}

void EstrategiaMovimientoRegresarACueva::decidirNuevaDireccion(Punto* punto){

	Lista<Punto>* lista = this->getListaPuntosPosibles(punto);
	lista->setComparador(new ComparadorPunto());
	Punto* masCercano = this->calcularMasCercano(lista,punto);

	this->actualizarDirecciones(punto, masCercano);

	Direccion* dirInvertida = new Direccion(this->direccionActual->getValor());
	dirInvertida->invertir();

	int aleatorio = rand() % 100; 
	// Si estoy por volver en direccion contraria pruebo otra opcion
	if(this->direccionActual && this->direccionAnterior &&
		dirInvertida->equals(this->direccionAnterior) && aleatorio < 80){
		lista->quitar(masCercano);
		Punto* anteriorMasCercano = masCercano;
		Punto* masCercano = this->calcularMasCercano(lista,punto);
		// Si la segunda alternativa no es quedarse quieto, entonces la uso
		if(!masCercano->equals(punto))
			this->actualizarDirecciones(punto, masCercano);
	}	
	
	delete dirInvertida;
	delete lista;
}

bool EstrategiaMovimientoRegresarACueva::esEstrategiaVolverACueva(){
	return true;
}

EstrategiaMovimientoRegresarACueva::~EstrategiaMovimientoRegresarACueva(){
	delete this->puntoCueva;
}